package asientos;

import java.math.BigDecimal;

import com.lanchita.excepciones.CodigoErroneoException;
import com.lanchita.excepciones.EstadoErroneoException;

import usuarios.Usuario;
import aerolineas.NombresAerolineas;
import aerolineas.OceanicWrapper;
import despegar.utiles.Fecha;

public class AsientoOceanic extends Asiento {
	private OceanicWrapper aerolinea;

	public AsientoOceanic(
			OceanicWrapper aerolinea,
			String codigoDeVuelo,
			BigDecimal precio,
			UbicacionesAsiento ubicacion,
			ClaseDeAsiento clase,
			String origen,
			String destino,
			Fecha fechaSalida,
			Fecha fechaLlegada,
			String horaSalida,
			String horaLlegada,
			Integer numeroAsiento,
			boolean estado) {
		
		this.setAerolinea(aerolinea);
		this.setCodigoDeVuelo(codigoDeVuelo);
		this.setPrecio(precio);
		this.setUbicacion(ubicacion);
		this.setClase(clase);
		this.setOrigen(origen);
		this.setDestino(destino);
		this.setFechaDeSalida(fechaSalida);
		this.setFechaDeLlegada(fechaLlegada);
		this.setHoraDeSalida(horaSalida);
		this.setHoraDeLlegada(horaLlegada);
		this.setNumeroDeAsiento(numeroAsiento);
		this.setEstado(estado);
	}
	
	/* ***********************************
	 * SETTERS
	 ************************************/
	private void setAerolinea(OceanicWrapper aerolinea) {
		this.aerolinea = aerolinea;
	}
	@Override
	protected void setOrigen(String origen) {
		this.origen = this.adaptarLugar(origen);
	}
	@Override
	protected void setDestino(String destino) {
		this.destino = this.adaptarLugar(destino);
	}
	
	/* ***********************************
	 * API
	 ************************************/
	@Override
	public boolean sosDeLaAerolinea(String nombreDeLaAerolinea) {
		return nombreDeLaAerolinea.equals(NombresAerolineas.OCEANIC);
	}
	
	
	@Override
		public void reservar (Usuario usuarioQueReserva){
			if (!this.estaLibre()
					|| this.aerolinea.estaReservado(this.getCodigoDeVuelo(), this.getNumeroDeAsiento())
					|| !this.aerolinea.reservar(usuarioQueReserva.getDni(), this.getCodigoDeVuelo(), this.getNumeroDeAsiento())
					){
					throw new EstadoDeAsientoIncorrectoException();
			
			}
			this.setEstado(EstadosAsiento.RESERVADO);
			usuarioQueReserva.registrarReserva(this);
			this.registrarReserva(usuarioQueReserva.getDni());
		
	}
	
	
	@Override
	public void comprar(Usuario usuarioQueCompra) {

		if ((this.getEstado().equals(EstadosAsiento.RESERVADO))&&(this.registroReservas.get(0).equals(usuarioQueCompra.getDni()))) {
			usuarioQueCompra.eliminarReserva(this);
		} else {
			if(!this.aerolinea.comprarSiHayDisponibilidad(usuarioQueCompra.getDni(), this.getCodigoDeVuelo(), this.getNumeroDeAsiento())) {
				throw new EstadoDeAsientoIncorrectoException();
			}
		}

		
		this.setEstado(EstadosAsiento.COMPRADO);
		usuarioQueCompra.registrarCompra(this);
	}
	@Override
	public String getAerolinea() {
		return NombresAerolineas.OCEANIC;
	}
	
	@Override
	public String getDestino() {
		return this.adaptarLugar(this.destino);
		
	}
	
	@Override
	public String getOrigen() {
		return this.adaptarLugar(this.origen);
	}
	
	
	/* ***********************************
	 * OTROS
	 ************************************/
	private String adaptarLugar(String lugarFormatoOceanic) {
		if(lugarFormatoOceanic.substring(0, 1).equals("_")) {
			return lugarFormatoOceanic.substring(1);
		}
		if(lugarFormatoOceanic.equals("SLA")) {
			return "LA";
		}
		return lugarFormatoOceanic;		
	}
	
	protected void setEstado(boolean estado) {
		if(estado) {
			this.setEstado(EstadosAsiento.RESERVADO);
		}
		else {
			this.setEstado(EstadosAsiento.DISPONIBLE);
		}
	}


}
